#pragma once

#include "Icharacters.hh"
#include <string>
#include "../Utils/include/json.hpp"
#include "Inventory.hh"

using json = nlohmann::json;

// 玩家类,继承自角色基类
class Player : public ICharacter {
private:
    int id_;                // 玩家ID
    std::string name_;      // 玩家名称
    int hp_;               // 当前生命值
    int maxhp_;            // 最大生命值
    int atk_;              // 攻击力
    int def_;              // 防御力
    int speed_;            // 速度值（闪避率），取值范围 0~100
    Inventory bag_;        // 玩家背包

public:
    Player() = default;
    Player(int id, const std::string& name, int hp, int maxhp, int atk, int def, int speed);
    Player(const Player& other);
    Player& operator=(const Player& other);
    ~Player();

    // 实现ICharacter接口的方法
    bool isAlive() const override;                    // 检查是否存活
    bool takeDamage(unsigned damage) override;        // 受到伤害
    bool attack(ICharacter& target) override;         // 攻击目标

    // 获取角色属性
    std::string getName() const override;             // 获取名称
    std::string getDescription() const override;      // 获取描述
    unsigned getHealth() const override;              // 获取当前生命值
    unsigned getmaxHealth() const;                    // 获取最大生命值
    unsigned getAttack() const override;              // 获取攻击力
    unsigned getDefense() const override;             // 获取防御力
    std::string toString() const override;            // 转换为字符串表示

    // 背包相关
    void addToInventory(Item* item) override;         // 添加物品到背包
    void displayInventory() const override;           // 显示背包内容
    void display() const override;                    // 显示角色状态

    // 其他方法
    void heal(int amount);                           // 恢复生命值
    Inventory& getInventory();                       // 获取背包引用
    int getSpeed() const;                            // 获取速度值
    void setSpeed(int speed);                        // 设置速度值

    // 属性设置
    void setAttack(unsigned atk);                    // 设置攻击力
    void setDefense(unsigned def);                   // 设置防御力
    void setHpMax(unsigned maxhp);                   // 设置最大生命值

    // JSON序列化支持
    friend void from_json(const json& j, Player& p);
    friend void to_json(json& j, const Player& p);
};

void from_json(const json& j, Player& p);